Configurez un serveur de temps pour être toujours à l’heure

Sur un serveur, beaucoup de programmes utilisent l’heure système : des logs qui sont tous horodatés aux bases de données qui enregistrent l’heure de certains changements, les applications sont nombreuses. La précision de l’heure devient particulièrement critique dès lors que plusieurs machines travaillent ensemble car elles utilisent souvent l’heure pour synchroniser leurs actions. Vous aurez vous-même certainement besoin de vous appuyer sur l’heure si vous devez faire le lien entre plusieurs fichiers de logs répartis sur plusieurs machines.

Dans un premier temps, je vais vous montrer comment configurer manuellement l’heure de votre système. C’est toujours utile mais pour être sûr de garder votre serveur à l’heure à tout moment, ce ne sera pas suffisant. Je vous montrerai donc ensuite comment utiliser le protocole NTP, pour Network Time Protocol, pour synchroniser en continu l’heure de tous les ordinateurs de votre réseau avec des horloges de référence en ligne.

Régler l’heure de votre système avec timedatectl

Dans le chapitre précédent, je vous disais que systemD est utilisé pour gérer de plus en plus de fonctions système. En voilà un nouvel exemple puisqu’il permet même de configurer l’heure de votre serveur. Pour cela, vous utiliserez la commande  timedatectl  .

Utilisée seule, la commande  timedatectl  affichera les informations sur l’heure de votre système :

$ timedatectl

     Local time: Wed 2018-05-30 08:49:37 UTC

                 Universal time: Wed 2018-05-30 08:49:37 UTC

                       RTC time: Wed 2018-05-30 08:49:38

                      Time zone: Etc/UTC (UTC, +0000)

      System clock synchronized: yes

systemd-timesyncd.service active: yes

                RTC in local TZ: no       

Si votre horloge n’est pas synchronisée automatiquement en ligne, vous pouvez configurer l’heure de votre serveur en utilisant  set-time  :

$ sudo timedatectl set-time “2018-10-30 18:32:53”

Vous pouvez également lister les différents fuseaux horaires par  list-timezones  mais attention, il y en a beaucoup...

$ timedatectl list-timezones | grep Paris

Europe/Paris

Vous pouvez ensuite configurer votre fuseau horaire grâce à  set-timezone  :

$ sudo timedatectl set-timezone Europe/Paris

Passez maintenant au niveau supérieur et partez à la découverte de NTP.

Gérez l’heure de votre réseau avec NTP

NTP est donc un protocole qui permet de synchroniser l’heure de différents systèmes à travers un réseau IP. Des clients synchronisent leur horloge avec des serveurs. Ces serveurs se synchronisent eux-même avec d’autres serveurs et ainsi de suite. Ce réseau est organisé en couches qu’on appelle des strata (un stratum, des strata, vive le latin !).

Schéma du réseau NTP et ses différentes strates depuis les horloges atomiques (stratum 0) jusqu'aux postes clients.Schéma du réseau NTP et ses différentes strates depuis les horloges atomiques (stratum 0) jusqu'aux postes clients.
 

Le plus haut niveau est le stratum 0 qui est composé de matériels spécialisés généralement couplés avec des horloges atomiques. Les serveurs synchronisés directement avec des serveurs de stratum 0 sont appelés stratum 1 puis les serveurs synchronisés avec les serveurs de stratum 1 sont des stratum 2 et ainsi de suite.

Beaucoup d’organisations gèrent leurs propres serveurs de temps. Certaines organisations ne permettent qu’une utilisation en interne de leur serveur NTP tandis que d’autres permettent une utilisation publique de leur serveur. Un des plus grands cluster de serveurs NTP publiques est appelé pool.ntp.org. C’est celui qui est configuré par défaut dans la plupart des distributions Linux.

Sous les dernières versions d’Ubuntu, l’horloge système est automatiquement synchronisée en réseau. Cette synchronisation est gérée par le service systemD  systemd-timesyncd.service  . Vous pouvez accéder à plus d’informations sur ce service par la commande :

$ systemctl status systemd-timesyncd

Il est donc possible de synchroniser l’horloge de tous les serveurs de son réseau en synchronisant chacun d’entre eux avec le réseau mondial NTP mais dès que votre réseau grossit, il devient avantageux d’avoir son propre serveur NTP. En effet, avoir son propre serveur NTP permet :

Voyons donc comment installer votre propre serveur NTP.

Gérez votre propre serveur NTP avec Chrony

À partir de la version 18.04, Ubuntu utilise le logiciel Chrony comme serveur NTP par défaut. Vous pouvez installer ce programme par la commande :

$ sudo apt-get install chrony

Vous devez ensuite configurer Chrony en éditant le fichier /etc/chrony/chrony.conf. Voici quelques explications sur les informations que vous trouvez dans ce fichier de configuration :

pool ntp.ubuntu.com        iburst maxsources 4

pool 0.ubuntu.pool.ntp.org iburst maxsources 1

pool 1.ubuntu.pool.ntp.org iburst maxsources 1

pool 2.ubuntu.pool.ntp.org iburst maxsources 2

Les lignes commençant par  pool  indiquent l’adresse des serveurs NTP (ou des groupes de serveurs plus exactement) à utiliser et le nombre de ressources maximum à utiliser pour chacun d’entre eux. A priori, vous pouvez continuer à utiliser la sélection par défaut.

driftfile /var/lib/chrony/chrony.drift

driftfile  indique le fichier à utiliser pour enregistrer la dérive de temps de votre serveur par rapport au pool. Ça permet de resynchroniser plus vite votre horloge.

Par défaut, Chrony ne permet pas à des clients de se synchroniser avec ce service de temps. Vous devez explicitement autoriser le réseau de vos clients par la directive  allow  . Rajoutez donc en fin de fichier la ligne suivante et enregistrez votre fichier :

allow 192.168.0/24

Vous pouvez alors lancer Chrony et l’activer au démarrage du serveur :

$ sudo systemctl enable chrony

$ sudo systemctl start chrony

Par défaut, Chrony écoute sur le port UDP 123 (port par défaut pour le service NTP). Assurez-vous d’avoir ouvert ce port sur votre pare-feu pour que vos clients puissent se synchroniser.

Comme Chrony s’occupe maintenant de synchroniser votre horloge système, vous pouvez désactiver  systemd-timesyncd  par :

$ sudo timedatectl set-ntp false

Chrony fournit une interface en ligne de commande pour interroger et gérer Chrony :  chronyc  . Vous pouvez par exemple afficher les serveurs avec lesquels vous êtes synchronisé par la commande :

$ chronyc sources

210 Number of sources = 8

MS Name/IP address         Stratum Poll Reach LastRx Last sample            

===============================================================================

^+ golem.canonical.com           2   6 377    22    -86ms[  -86ms] +/-  138ms

^- pugot.canonical.com           2   6 377    24    -27ms[  -27ms] +/-   69ms

^- chilipepper.canonical.com     2   6 377    87  +1290us[+2012us] +/-   65ms

^- alphyn.canonical.com          2   6 377    20   -123ms[ -123ms] +/-  217ms

^- ks3301805.kimsufi.com         3   6    77    23    -27ms[  -27ms] +/-   96ms

^* ntp-sop.inria.fr              1   6 377    86   +300us[+1022us] +/-   15ms

^- kiwi.bitschine.fr             2   6 377    22  -2061us[-2061us] +/-   35ms

^+ mail.fangfufu.co.uk           2   6 377    23   -143us[ -143us] +/-   27m

Le serveur qui commence par  ^*  est la source de temps actuelle. Ceux qui commencent par  ^+  sont utilisés pour calculer une moyenne de temps et ceux qui commencent par  ^-  ne sont pas utilisés actuellement.

Il est maintenant temps de configurer votre client pour utiliser votre serveur NTP local.

Configurez votre client pour utiliser votre propre serveur NTP

La manière d’indiquer l’adresse de votre serveur NTP à votre client dépendra évidemment du système sur lequel il est installé. Si vous avez repris le client configuré dans le cours “Montez un serveur de fichiers sous Linux”, votre client est sous Ubuntu et est déjà synchronisé par le service  systemd-timesyncd  . Il ne vous reste alors qu’à lui indiquer l’adresse de votre serveur en éditant le fichier  /etc/systemd/timesyncd.conf  :

[Time]

NTP=vm-serveu

Vous pouvez ensuite redémarrer votre service pour prendre en compte la nouvelle configuration :

$ sudo systemctl restart systemd-timesyncd

Enfin, vous pouvez vérifier que la synchronisation se fait bien par la commande :

$ sudo systemctl status systemd-timesyncd

● systemd-timesyncd.service - Network Time Synchronization

  Loaded: loaded (/lib/systemd/system/systemd-timesyncd.service; enabled; vendor preset: enabled)

  Active: active (running) since Wed 2018-05-30 13:06:29 CEST; 1h 10min ago

 Docs: man:systemd-timesyncd.service(8)

 Main PID: 3229 (systemd-timesyn)

 Status: "Synchronized to time server 192.168.0.1:123 (vm-serveur)

 Vous savez maintenant comment fournir un service de temps à votre réseau. Dans le prochain chapitre, vous apprendrez à gérer un autre service très courant : un annuaire LDAP.

Pour résumer